home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / CTOOLS10.ARJ / SET.H < prev    next >
C/C++ Source or Header  |  1991-12-31  |  4KB  |  135 lines

  1. /****************************************************************************
  2. *
  3. *                    Copyright (C) 1991 Kendall Bennett.
  4. *                            All rights reserved.
  5. *
  6. * Filename:        $RCSfile: set.h $
  7. * Version:        $Revision: 1.5 $
  8. *
  9. * Language:        ANSI C
  10. * Environment:    any
  11. *
  12. * Description:    Macros and function prototypes for the set manipulation
  13. *                module.
  14. *
  15. * $Id: set.h 1.5 91/12/31 19:41:22 kjb Exp $
  16. *
  17. * Revision History:
  18. * -----------------
  19. *
  20. * $Log:    set.h $
  21. * Revision 1.5  91/12/31  19:41:22  kjb
  22. * Modified include files directories.
  23. * Revision 1.4  91/09/27  03:11:10  kjb
  24. * Added compatibility with C++.
  25. * Revision 1.3  91/09/26  10:07:51  kjb
  26. * Took out extern references
  27. * Revision 1.2  91/09/01  01:16:00  ROOT_DOS
  28. * Changed search for include files to look in current directory
  29. * Revision 1.1  91/08/16  13:30:52  ROOT_DOS
  30. * Initial revision
  31. ****************************************************************************/
  32.  
  33. #ifndef    __SET_H
  34. #define    __SET_H
  35.  
  36. #ifndef    __DEBUG_H
  37. #include "debug.h"
  38. #endif
  39.  
  40. #ifndef    __STRING_H
  41. #include <string.h>
  42. #endif
  43.  
  44. /*---------------------- Macros and type definitions ----------------------*/
  45.  
  46. /* The following macros will need to be changed when porting from one
  47.  * platform to another.
  48.  */
  49.  
  50. typedef unsigned short        _SETTYPE;        /* one cell in bit map        */
  51. #define    _BITS_IN_WORD        16
  52. #define    _BYTES_IN_ARRAY(x)    (x << 1)        /* # of bytes in bit map    */
  53. #define    _DIV_WSIZE(x)        ((unsigned)(x) >> 4)
  54. #define    _MOD_WSIZE(x)        ((x) & 0x0F)
  55. #define    _DEFWORDS            8                /* elements in default set    */
  56. #define    _DEFBITS    (_DEFWORDS * _BITS_IN_WORD)    /* Bits in default set    */
  57. #define    _ROUND(bit)    (((_DIV_WSIZE(bit) + 8) >> 3) << 3)
  58.  
  59. typedef struct _set_ {
  60.     unsigned char    nwords;            /* Number of words in map            */
  61.     unsigned char    compl;            /* is a negative true set if true    */
  62.     unsigned        nbits;            /* Number of bits in map            */
  63.     _SETTYPE        *map;            /* Pointer to the map                */
  64.     _SETTYPE        defmap[_DEFWORDS];    /* The map itself                */
  65.     } SET;
  66.  
  67.                                 /* Op argument passed to _set_op    */
  68. #define    _UNION            0        /* x is in s1 or s2                    */
  69. #define    _INTERSECT        1        /* x is in s1 and s2                */
  70. #define    _DIFFERENCE        2        /* (x in s1) && (s not in s2)        */
  71. #define    _ASSIGN            4        /* s1 = s2                            */
  72.  
  73. #define    UNION(d,s)        _set_op(_UNION,d,s)
  74. #define    INTERSECT(d,s)    _set_op(_INTERSECT,d,s)
  75. #define    DIFFERENCE(d,s)    _set_op(_DIFFERENCE,d,s)
  76. #define    ASSIGN(d,s)        _set_op(_ASSIGN,d,s)
  77.  
  78. #define    CLEAR(s)        memset( (s)->map, 0, (s)->nwords * sizeof(_SETTYPE))
  79. #define    FILL(s)            memset( (s)->map, ~0, (s)->nwords * sizeof(_SETTYPE))
  80. #define    COMPLEMENT(s)    ( (s)->compl = !(s)->compl)
  81. #define    INVERT(s)        invert(s)
  82.  
  83. #define    _SET_EQUIV        0    /* Value returned by _set_test, equivalent     */
  84. #define    _SET_DISJ        1    /*                                 disjoint     */
  85. #define    _SET_INTER        2    /*                                intersecting */
  86.  
  87. #define    IS_DISJOINT(s1,s2)        (_set_test(s1,s2) == _SET_DISJ)
  88. #define    IS_INTERSECTING(s1,s2)    (_set_test(s1,s2) == _SET_INTER)
  89. #define    IS_EQUIVALENT(s1,s2)    (_set_test(s1,s2) == _SET_EQUIV)
  90.  
  91. #define    IS_EMPTY(s)                (num_ele(s) == 0)
  92.  
  93. /* All of the following have heavy-duty side-effects. Be careful. */
  94.  
  95. #define    _GBIT(s,x,op)    ( ((s)->map)[_DIV_WSIZE(x)] op (1 << _MOD_WSIZE(x)) )
  96.  
  97. #define    REMOVE(s,x)        (((x) >= (s)->nbits) ? 0 : _GBIT(s,x,&= ~))
  98. #define    ADD(s,x)        (((x) >= (s)->nbits) ? _addset(s,x) : _GBIT(s,x,|=))
  99. #define    MEMBER(s,x)        (((x) >= (s)->nbits) ? 0 : _GBIT(s,x,&))
  100. #define    TEST(s,x)        (( MEMBER(s,x) ) ? !(s)->compl : (s)->compl )
  101.  
  102. /*-------------------------- Function Prototypes --------------------------*/
  103.  
  104. #ifdef __cplusplus
  105. extern "C" {
  106. #endif
  107.  
  108. SET *newset(void);
  109. void delset(SET *set);
  110. SET *dupset(SET *set);
  111. int _addset(SET *set,int bit);
  112. int num_ele(SET *set);
  113. int _set_test(SET *set1,SET *set2);
  114. int setcmp(SET *set1,SET *set2);
  115. unsigned sethash(SET *set);
  116. int subset(SET *set, SET *possible_subset);
  117. void _set_op(int op, SET *dest, SET *src);
  118. void invert(SET *set);
  119. void truncate(SET *set);
  120. int next_member(SET *set);
  121. void pset(SET *set,int (*output_routine)(void*,char*,int),
  122.           void *param);
  123.  
  124. #ifdef __cplusplus
  125. }
  126. #endif
  127.  
  128. #endif
  129.